package queue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.TimeUnit;


/*
阻塞队列演示
 */
public class BlockingQueueDemo {

  public static void main(String[] args) throws InterruptedException {

//    创建阻塞队列，并设置初始值为2
    ArrayBlockingQueue<String> arrayBlockingQueue = new ArrayBlockingQueue<>(2);

//    第一组
//    当队列满了后再往队列加元素会报错
//    System.out.println(arrayBlockingQueue.add("1"));
//    System.out.println(arrayBlockingQueue.add("2"));
//    System.out.println(arrayBlockingQueue.add("3"));
//    检查元素方法
//    System.out.println(arrayBlockingQueue.element());


//    当队列空了再往队列取元素会报错
//    System.out.println(arrayBlockingQueue.remove());
//    System.out.println(arrayBlockingQueue.remove());
//    System.out.println(arrayBlockingQueue.remove());

//    第二组
//    当队列满了再添加元素会返回false
//    System.out.println(arrayBlockingQueue.offer("1"));
//    System.out.println(arrayBlockingQueue.offer("2"));
//    System.out.println(arrayBlockingQueue.offer("3"));

//    当队列空了再取元素会返回null
//    System.out.println(arrayBlockingQueue.poll());
//    System.out.println(arrayBlockingQueue.poll());
//    System.out.println(arrayBlockingQueue.poll());
//    取的是最后进入队列的元素，当队列为空时返回null
//    System.out.println(arrayBlockingQueue.peek());

//    第三组
//    当队列满了还继续往队列添加元素时会发生阻塞
//    arrayBlockingQueue.put("1");
//    arrayBlockingQueue.put("2");
//    arrayBlockingQueue.put("3");

//    当队列空了还继续往队列取元素时会发生阻塞
//    arrayBlockingQueue.take();
//    arrayBlockingQueue.take();
//    arrayBlockingQueue.take();

//    第四组
//    表示当往队列追加元素时，在3秒内还追加不成功就结束程序
    System.out.println(arrayBlockingQueue.offer("1"));
    System.out.println(arrayBlockingQueue.offer("2"));
//    System.out.println(arrayBlockingQueue.offer("3",3, TimeUnit.SECONDS));

//    表示当往队列取元素时，在3秒内还取不成功就结束程序
    System.out.println(arrayBlockingQueue.poll(3, TimeUnit.SECONDS));
    System.out.println(arrayBlockingQueue.poll(3, TimeUnit.SECONDS));
    System.out.println(arrayBlockingQueue.poll(3, TimeUnit.SECONDS));
  }
}
